package com.sprouting.personal.controller;

import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.sprouting.personal.interfaces.common.Constant;
import com.sprouting.personal.model.common.ResultJson;
import com.sprouting.personal.model.entity.Config;
import com.sprouting.personal.model.vo.LunarVo;
import com.sprouting.personal.model.vo.PsEventVo;
import com.sprouting.personal.model.vo.TotalStatistic;
import com.sprouting.personal.service.*;
import com.sprouting.personal.utils.CheckTool;
import com.sprouting.personal.utils.DateTool;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 首页
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2022/11/13 13:34
 */
@RequestMapping("/home")
@RestController
@Slf4j
public class HomeController {

    @Autowired
    private PsEventService psEventService;
    @Autowired
    private ConfigService configService;
    @Autowired
    private MemberFamilyService memberFamilyService;
    @Autowired
    private WebsiteService websiteService;
    @Autowired
    private BookService bookService;
    @Autowired
    private MusicService musicService;
    @Autowired
    private PsMoviesService psMoviesService;
    @Autowired
    private GameService gameService;
    @Autowired
    private ShoppingCartService shoppingCartService;
    @Autowired
    private SoftwareService softwareService;


    /**
     * 天气查询的地址
     * 这里使用 讯飞语音识别内置的墨迹天气API，支持通过城市名直接查询或者通过经纬度查询，city和经纬度经过一种方式即可。
     * 注意：url中的openId、clientType以及sign等参数具体含义我也不清楚，但写此文档时如上参数是必需的，否则请求失败；具体传什么值好像并没影响。
     * 返回数据为json格式；支持未来7天的数据查询，支持的数据有天气、温度、湿度、PM2.5、PM10、空气指数、空气质量、日出时间、日落时间等；
     */
    @Value("${weather.query.url}")
    private String weatherQueryUrl;


    /**
     * 统计当前人员的一些收藏数量
     * @return
     */
    @GetMapping("/getDataStatistic")
    public ResultJson getDataStatistic(){
        // 统计有加入多少人
        Long memberFamilyTotal = memberFamilyService.getMemberFamilyTotal(StpUtil.getLoginIdAsString());
        // 网址、书籍、音乐、影视、软件、游戏、购物车
        Long webSiteTotal = websiteService.getWebSiteTotal(StpUtil.getLoginIdAsString());
        Long bookTotal = bookService.getBookTotal(StpUtil.getLoginIdAsString());
        Long musicTotal = musicService.getMusicTotal(StpUtil.getLoginIdAsString());
        Long softwareTotal = softwareService.getSoftwareTotal(StpUtil.getLoginIdAsString());
        Long gameTotal = gameService.getGameTotal(StpUtil.getLoginIdAsString());
        Long shoppingCartTotal = shoppingCartService.getShoppingCartTotal(StpUtil.getLoginIdAsString());

        TotalStatistic totalStatistic = new TotalStatistic();
        totalStatistic.setUserNum(memberFamilyTotal);
        totalStatistic.setWebNum(webSiteTotal);
        totalStatistic.setBookNum(bookTotal);
        totalStatistic.setMusicNum(musicTotal);
        totalStatistic.setSoftwareNum(softwareTotal);
        totalStatistic.setGameNum(gameTotal);
        totalStatistic.setShoppingCartNum(shoppingCartTotal);
        return ResultJson.success(totalStatistic);
    }

    /**
     * 查询首页的时间信息
     * @return
     */
    @GetMapping("/getCalendar")
    public ResultJson getCalendar(){
        LunarVo lunarVo = DateTool.toLunar(new Date());
        return ResultJson.success(lunarVo);
    }

    /**
     * 获取当前时间
     * @return
     */
    @SaIgnore
    @GetMapping("/getTime")
    public ResultJson getTime(){
        return ResultJson.success(DateUtil.now());
    }

    /**
     * 根据字符串日期转换为阴历
     * @param solar 阳历日期
     * @return
     */
    @PostMapping("/solarToLunar")
    public ResultJson solarToLunar(String solar){
        if (CheckTool.checkNull(solar)){
            return ResultJson.error("请输入日期");
        }

        try {
            DateTime parse = DateUtil.parse(solar, DatePattern.NORM_DATE_FORMAT);
            return ResultJson.success(DateTool.toLunar(parse));
        } catch (Exception e) {
            log.error("转换日期错误:", e);
            return ResultJson.error("非法的时间");
        }
    }

    /**
     * 历史上的今天，历史上的这一天发生的事情
     * 对应首页的流水式历史的今天
     * @return
     */
    @GetMapping("/getTodayInHistory")
    public ResultJson getTodayInHistory(){
        String userId = StpUtil.getLoginIdAsString();
        // 倒推一年
        DateTime oneYear = DateUtil.offsetMonth(new Date(), -12);
        // 过去2年
        DateTime twoYear = DateUtil.offsetMonth(new Date(), -24);
        // 过去3年
        DateTime threeYear = DateUtil.offsetMonth(new Date(), -36);
        DateTime fourYear = DateUtil.offsetMonth(new Date(), -48);
        DateTime fiveYear = DateUtil.offsetMonth(new Date(), -60);
        DateTime sixYear = DateUtil.offsetMonth(new Date(), -72);
        DateTime sevenYear = DateUtil.offsetMonth(new Date(), -84);
        DateTime eightYear = DateUtil.offsetMonth(new Date(), -96);

        // 查询事件表
        List<Long> list = new ArrayList<>();
        // 数据库存储的是13位时间戳，精度是毫秒，这里获取的是10位的时间戳，精度是秒，转换要乘以或者除以1000
        list.add(DateUtil.parseDateTime(DateUtil.formatDate(oneYear) + " 00:00:00").getTime());
        list.add(DateUtil.parseDateTime(DateUtil.formatDate(twoYear) + " 00:00:00").getTime());
        list.add(DateUtil.parseDateTime(DateUtil.formatDate(threeYear) + " 00:00:00").getTime());
        list.add(DateUtil.parseDateTime(DateUtil.formatDate(fourYear) + " 00:00:00").getTime());
        list.add(DateUtil.parseDateTime(DateUtil.formatDate(fiveYear) + " 00:00:00").getTime());
        list.add(DateUtil.parseDateTime(DateUtil.formatDate(sixYear) + " 00:00:00").getTime());
        list.add(DateUtil.parseDateTime(DateUtil.formatDate(sevenYear) + " 00:00:00").getTime());
        list.add(DateUtil.parseDateTime(DateUtil.formatDate(eightYear) + " 00:00:00").getTime());

        Page<PsEventVo> page = new Page<>();
        return ResultJson.success(psEventService.getEventByEventTimePage(page, list, userId));
    }

    /**
     * 获取城市未来的天气
     * 2023年2月10日00:53:04 因为墨迹天气的接口失效，这里改为和风天气，直接读取数据
     * @return
     */
    @GetMapping("/getWeather")
    public ResultJson getWeather(){
        String userId = StpUtil.getLoginIdAsString();
        // 从配置中心查询个人的配置信息
        Config config = configService.getConfigByCodeAutomaticCompletion(Constant.ConfigCode.WEATHER_QUERY, userId);
        if (config == null || CheckTool.checkNull(config.getValue())){
            // 默认返回北京
            return ResultJson.success("101010100");
        } else {
            return ResultJson.success(config.getValue());
        }
        // Config key = configService.getConfigByCodeAutomaticCompletion(Constant.ConfigCode.WEATHER_KEY, userId);
        // if (key == null || CheckTool.checkNull(key.getValue())){
        //     return ResultJson.error("未绑定城市天气key");
        // }
        // if (CheckTool.checkNull(weatherQueryUrl)){
        //     return ResultJson.error("无效的查询API接口");
        // }

        // String format = String.format(weatherQueryUrl, config.getValue(), key.getValue());
        // String content = HttpUtil.get(format);
        // if (CheckTool.checkNull(content)){
        //     return ResultJson.error("访问API异常");
        // }
        // JSONObject jsonObject = JSONUtil.parseObj(content);
        // JSONObject now = jsonObject.getJSONObject("now");
        // return ResultJson.success(now);
    }


}
